#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    EnvFile="../common/0_env.sh"
    # shellcheck source=../common/0_env.sh
    source ${EnvFile}
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试在同一个配额目录内部 rename/mv 子目录"
echo -e "***********************************************************************"

tmp_dir="/test_rename_dir"
src_dir="/test_rename_dir/src_dir"
dest_dir="/test_rename_dir/dest_dir"
abs_tmp_dir="${MountPoint}${tmp_dir}"
abs_src_dir="${MountPoint}${src_dir}"
abs_dest_dir="${MountPoint}${dest_dir}"
abs_other_dir="${MountPoint}/tmp"

function init_dir()
{
    mkdir -p ${abs_tmp_dir}
    clean_dir ${abs_tmp_dir}
    orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
    chown -R root:root ${abs_tmp_dir}
    remove_all_quota_for_dir ${tmp_dir}
}

function test_no_quota()
{
    echo -e "\n------测试没有配额时 mv subdir------"

    print3s "mv ./src ./dest(not exist)"
    mkdir -p ${abs_src_dir}
    exec_tree ${abs_tmp_dir}
    test_cmd "mv ${abs_src_dir} ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}

    print3s "mv ./src ./dest(exist)"
    test_cmd "mkdir -p ${abs_src_dir}"
    test_cmd "mkdir -p ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}
    test_cmd "mv ${abs_src_dir} ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}

    print3s "mv ./src/subdir ./dest (./dest/subdir not exist)"
    test_cmd "mkdir -p ${abs_src_dir}/subdir"
    test_cmd "mkdir -p ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}
    test_cmd "mv ${abs_src_dir}/subdir ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}
    
    clean_dir ${abs_tmp_dir}
}

function test_no_quota_error()
{
    echo -e "\n------测试没有配额时 mv subdir 错误场景（目标存在）------"
    print3s "mv ./src/subdir ./dest (./dest/subdir exist)"
    test_cmd "mkdir -p ${abs_src_dir}/subdir"
    test_cmd "mkdir -p ${abs_dest_dir}/subdir"
    exec_tree ${abs_tmp_dir}
    test_error_cmd "mv ${abs_src_dir}/subdir ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}

    clean_dir ${abs_tmp_dir}
}

function test_quota_error()
{
    echo -e "\n------测试配额时 mv subdir 错误场景------"
    
    print3s "源目录 是 配额目录"
    test_cmd "mkdir -p ${abs_src_dir}"
    create_quota ${src_dir} "--hardnum=1000"
    test_error_cmd "mv ${abs_src_dir} ${abs_dest_dir}"

    print3s "源目录 是 配额目录父目录"
    test_error_cmd "mv ${abs_tmp_dir} ${abs_other_dir}"

    print3s "目标目录 是 配额目录"
    test_cmd "mkdir -p ${abs_dest_dir}"
    rm_abs_dir ${abs_src_dir}
    test_error_cmd "mv ${abs_dest_dir} ${abs_src_dir}"
    
    remove_quota_dir ${src_dir}
    clean_dir ${abs_tmp_dir}
}

function test_sameParentdir()
{
    echo -e "\n------测试<普通目录>配额：相同父目录 mv subdir------配额不变"
    create_quota ${tmp_dir} "--hardnum=1000"
    mkdir -p ${abs_src_dir}
    srcFile="${abs_src_dir}/file"
    test_cmd "echo 123456 > ${srcFile}"
    exec_tree ${abs_tmp_dir}

    test_cmd "mv ${abs_src_dir} ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}

    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_diffParentdir()
{
    echo -e "\n------测试<普通目录>配额：不同父目录 mv subdir------配额不变"
    mkdir -p ${abs_src_dir}
    mkdir -p ${abs_dest_dir}
    create_quota ${tmp_dir} "--hardnum=1000"
    
    abs_src_sub="${abs_src_dir}/subdir"
    srcFile="${abs_src_sub}/file"
    mkdir -p ${abs_src_sub}
    test_cmd "echo 123456 > ${srcFile}"
    exec_tree ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
    test_cmd "mv ${abs_src_sub} ${abs_dest_dir}"
    exec_tree ${abs_tmp_dir}

    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_diffParentdir_uid()
{
    echo -e "\n------测试<目录uid>配额：不同父目录 mv subdir------父目录 uid 相同"
    mkdir -p ${abs_src_dir}
    mkdir -p ${abs_dest_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000" "--uid=${SysUid}"
    
    abs_src_sub="${abs_src_dir}/subdir"
    srcFile="${abs_src_sub}/file"

su ${SysUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_src_sub}
    test_cmd "echo 123456 > ${srcFile}"
EOF
    exec_tree -u ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    test_cmd "mv ${abs_src_sub} ${abs_dest_dir}"
    exec_tree -u ${abs_tmp_dir}

    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_diffParentdir_diff_uid()
{
    echo -e "\n------测试<目录uid>配额：不同父目录 mv subdir------父目录 uid 不同"
    mkdir -p ${abs_src_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    chmod 0777 -R ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000" "--uid=${SysUid}"
    
    abs_src_sub="${abs_src_dir}/subdir"
    srcFile="${abs_src_sub}/file"

su ${SysUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_src_sub}
    test_cmd "echo 123456 > ${srcFile}"
EOF

su ${HzzUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_dest_dir}
EOF
    exec_tree -u ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    
    test_cmd "mv ${abs_src_sub} ${abs_dest_dir}" 
    exec_tree -u ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    abs_dest_sub="${abs_dest_dir}/subdir"
    test_cmd "mv ${abs_dest_sub} ${abs_src_dir}"
    exec_tree -u ${abs_tmp_dir} 
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_diffParentdir_diff_gid()
{
    echo -e "\n------测试<目录uid>配额：不同父目录 mv subdir------父目录 gid 不同"
    mkdir -p ${abs_src_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    chmod 0777 -R ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000" "--gid=${SysGid}"
    
    abs_src_sub="${abs_src_dir}/subdir"
    srcFile="${abs_src_sub}/file"

su ${SysUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_src_sub}
    test_cmd "echo 123456 > ${srcFile}"
EOF

su ${HzzUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_dest_dir}
EOF
    exec_tree -u ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    
    test_cmd "mv ${abs_src_sub} ${abs_dest_dir}" 
    exec_tree -u ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    abs_dest_sub="${abs_dest_dir}/subdir"
    test_cmd "mv ${abs_dest_sub} ${abs_src_dir}"
    exec_tree -u ${abs_tmp_dir} 
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
}

init_dir

# 测试没有配额时 rename file
 test_no_quota 
 test_no_quota_error

# 测试存在配额时的错误场景
 test_quota_error

# 测试同一配额目录<相同父目录>，目标肯定不存在
 test_sameParentdir

# 测试同一配额目录<不同父目录>，目标肯定不存在
  test_diffParentdir 
  test_diffParentdir_uid
  test_diffParentdir_diff_uid
  test_diffParentdir_diff_gid








